package communicationUDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

import protocol.*;

/**
 * Client TCP d'un serveur distant
 * 
 * @author Alexandre BOURSIER, Nolan POTIER
 */
public class Client_UDP {
	private DatagramPacket packet;
	private DatagramSocket datagram;
	private final String ip = "157.169.103.73";
	private InetAddress IP;
	private final int port = 1025;

	/**
	 * Constructeur normal
	 */
	public Client_UDP() {
		try {
			// Récupérer l'adresse du serveur cible
			IP = InetAddress.getByName(ip);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		System.out.println("Creation du client");
	}

	/**
	 * Ajouter un nom et un des ses surnoms associé
	 * @param surnom
	 * 		le surnom cible
	 * @param nom
	 * 		le nom cible
	 */
	public void ajouter(String surnom, String nom) {
		Add add1 = new Add(surnom, nom);
		// Créer le datagramme pour l'envoie du message
		createDatagram(add1);
		// Attendre la réponse du serveur
		responseToDatagram();
	}

	/**
	 * Lister l'ensemble de tous les noms/surnoms cibles du serveur
	 */
	public void lister() {
		List list = new List();
		createDatagram(list);
		responseToDatagram();
	}

	/**
	 * Lister l'ensemble des surnoms d'un nom choisi
	 * @param nom
	 * 		le nom cible
	 */
	public void lister(String nom) {
		List list = new List(nom);
		createDatagram(list);
		responseToDatagram();
	}
	
	/**
	 * Se déconnecter du serveur
	 */
	public void quitter() {
		Request req = new Request(Type.EXIT);
		createDatagram(req);
		System.out.println("Fermeture du client");
	}

	/**
	 * Création du datagramme pour l'envoi du message
	 * @param req
	 * 		la requête cible
	 */
	void createDatagram(Request req) {
		// Transformer la requête en une chaîne littérale
		Objet_to_UDP obj = new Objet_to_UDP(req);
		// Construire le datagramme pour envoyer des paquets
		packet = new DatagramPacket(obj.getMess(), obj.getMess().length, IP,
				port);
		try {
			// Associer la socket
			datagram = new DatagramSocket();
			// Envoyer le message cible
			datagram.send(packet);
		} catch (SocketException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Recevoir la réponse au datagramme envoyé
	 */
	void responseToDatagram(){
		byte[] rep = new byte[256];
		String message = null;
		// Initialiser un paquet de réception
		DatagramPacket paquet = new DatagramPacket(rep, 256);
		try {
			// Recevoir la réponse cible
			datagram.receive(paquet);
			// Récupérer la donnée du paquet
			rep = paquet.getData();
			message = new String (rep);
			// Se borner à la fin du message
			int pipe = message.indexOf("|");
			// Découper le message
			message = message.substring(0, pipe);
			// Afficher le message
			System.out.println(message);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Point d'entrée de l'application
	 * @param args
	 */
	public static void main(String[] args) {
		Client_UDP client = new Client_UDP();
		client.ajouter("nolan", "papa");
		client.ajouter("nolan", "nolspot");
		client.ajouter("alex", "bourse");
		client.ajouter("nathan", "sliptaché");

		client.lister();
		client.lister("nolan");
		client.lister("nathan");
		client.lister("slip");
		
		client.lister("nolan");
		
		client.quitter();
	}
}